gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdib/jpg.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK多媒体类库 ringdib.lib
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:jpg.cpp
//
//说明:载入JPEG图象。
// 		JPEG的解码/编码用到了一个现成的类库JPEG.LIB,文件位置:
//			free_lib\jpeg,在这里要感谢JPEG 工作小组。
//			special thanks to the work of Tom Lane, Philip Gladstone,
//			Luis Ortiz, Jim Boucher, Lee Crocker, Julian Minguillon,
//			George Phillips, Davide Rossi,Ge' Weijers, and other members
//			of the Independent JPEG Group.
//
**********************************************************************/
#define MAKE_SELF_LIB
#include "ringdib.h"

#ifdef __cplusplus
extern "C" {
#endif
extern BYTE * JpegFileToRGB(LPSTR fileName,UINT *width,UINT *height);
extern BOOL GetJPGSize(LPSTR fileName,UINT *width,UINT *height);
extern BOOL BGRFromRGB(LPBYTE dest,BYTE *src, UINT widthPix, UINT height);
extern BOOL RGBToJpegFile(LPSTR fileName,BYTE *dataBuf,UINT widthPix,UINT height,BOOL bRGB,int quality);
#ifdef __cplusplus
}
#endif

BOOL LoadJPG(LPCTSTR szFilename,RingDIB* rdib,int iFlag,LPSTR lpszFormat)
{
	if(iFlag == DIB_GETFORMAT)
	{
		if(lpszFormat)
		{
			wsprintf(lpszFormat,"jpeg");
			return TRUE;
		}
		else
			return FALSE;
	}

	LPBYTE tmp;
   UINT w,h;

	tmp=JpegFileToRGB((LPSTR)szFilename,&w,&h);
   if(tmp==NULL)
   	return FALSE;
	else if(iFlag == DIB_QUERYSUPPORT)
	{
		delete []tmp;
		return TRUE;
	}

   rdib->Create(w,h);
   BGRFromRGB((LPBYTE)rdib->Data(),tmp,w,h);

   delete []tmp;

   rdib->SetSrc(0,0);
   rdib->SetDest(0,0);

   return TRUE;
}

BOOL SaveJPG(LPCTSTR szFilename,RingDIB* rdib,BOOL bRGB/*=NULL*/,int quality/*=50*/)
{
	if(rdib)
	{
		int w = rdib->Width(),h = rdib->Height();
		LPBYTE lpb = (LPBYTE)New(w * h * 3);
		//int size = (rdib->Width() * rdib->Height()) << 2;
		LPBYTE lpd,lps = (LPBYTE)rdib->Data();

		if(lpb)
		{
		   lpd = lpb + w * 3 * (h - 1);
         int height_plus= w * 6;
         
			for(int j=0;j<h;j++)
			{
   			for(int i=0;i<w;i++)
				{
					lpd[0] = lps[2];
					lpd[1] = lps[1];
					lpd[2] = lps[0];
					lpd += 3;
					lps += 4;
				}
				lpd -= height_plus;
			}      
		}
		BOOL bok = RGBToJpegFile((LPSTR)szFilename,lpb,rdib->Width(),rdib->Height(),bRGB,quality);

		Del(lpb);
		return bok;
	}
	else
		return FALSE;
}